home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / simcode.arc / KEYPARSE.PAS < prev    next >
Pascal/Delphi Source File  |  1985-01-19  |  14KB  |  505 lines

  1. {$symtab-,$linesize:131,$pagesize:86,$debug-,
  2. $title:'KEYPARSE.PAS -- Parse the input keys'}
  3. {    COPYRIGHT @ 1982
  4.     Jim Holtman and Eric Holtman
  5.     35 Dogwood Trail
  6.     Randolph, NJ 07869
  7.     (201) 361-3395
  8. }
  9. {$list-}
  10. {$include:'filkqq.inc'}
  11. {$list+,Included 'filkqq.inc'}
  12.  
  13.  module keyparse;
  14.  
  15.     uses
  16.        filkqq;
  17.  
  18.     const
  19.        Alt_C = 46;           {Alternate C - log file switch}
  20.        Alt_D = 32;           {Alternate D - Dump the file to Comm line}
  21.        Alt_F = 33;           {Alternate F - turn on line edit mode}
  22.        Alt_E = 18;           {toggle the vi_cursor mode}
  23.        Alt_H = 35;           { Help screen }
  24.        Alt_K = 37;           { Alternate login functions }
  25.        Alt_L = 38;           { Executing login scripts }
  26.        Alt_R = 19;           {XModem Receive}
  27.        Alt_T = 20;           {XModem Transmit}
  28.        Alt_P = 25;           {Toggle prime mode}
  29.        Alt_V = 47;           {Ventel functions entry point }
  30.        F1 = 59;        {function key 1}
  31.        F2 = 60;        {function key 2}
  32.        F3 = 61;        {function key 3}
  33.        F4 = 62;           {ask for directory to list}
  34.        F5 = 63;        {function key 5, send an "l" (for reading
  35.                       notes) }
  36.        F6 = 64;        {function key 6, send a "j" (for reading
  37.                       notes) }
  38.        F8 = 66;        {function key 8}
  39.        Alt_F1 = 104;           {Alternate F1}
  40.        Alt_F2 = 105;           {Alternate F2}
  41.        Alt_F3 = 106;           {Alternate F3}
  42.        Alt_F4 = 107;           {Alternate F4 -- toggle the masking bit}
  43.        Alt_F5 = 108;           {Alternate F5 -- clear 25th line}
  44.        Alt_F6 = 109;           {Alternate F6 -- display modes on 25th line}
  45.        Alt_F7 = 110;           {reset the Communications software}
  46.        Alt_F10 = 113;           {Exit, but clear screen first}
  47.        HOME = 71;           {HOME key}
  48.        PrtSc = 114;           {CNTL-PrtSc}
  49.        CNTL_Pg_Dn = 118;       {Download -- UNIX -> IBM}
  50.        CNTL_Pg_Up = 132;       {Upload -- IBM -> UNIX}
  51.        Alt_1 = 120;
  52.        Alt_0 = 129;
  53.        Alt_MINUS = 130;
  54.        Alt_EQUAL = 131;
  55.  
  56.     var
  57.        [external] function_keys : array[1..10] of lstring(30);
  58.        adm_sim_flag : boolean;
  59.        bbs_numbers : boolean;
  60.        char_graphics : boolean;
  61.        display_buffer_addr : word;
  62.        display_columns : boolean;
  63.        display_control : boolean;
  64.        emacs_flag : boolean;
  65.        ignore_dels : boolean;
  66.        insert_mode : boolean;
  67.        line_edit : boolean;
  68.        log_file : file of char;
  69.        log_flag : boolean;
  70.        lpt_only_flag : boolean;
  71.        parity_mask : integer;
  72.        prime_mode : boolean;
  73.        rogue_mode : boolean;
  74.        scroll_top : integer;
  75.        vi_cursor : boolean;
  76.        xoff_sent : boolean;
  77.  
  78. {$include:'simterm.inc'}
  79. {$include:'graph.inc'}
  80. {$include:'comm.inc'}
  81.  
  82.     procedure savescreen; external;
  83.  
  84.     procedure restorescreen; external;
  85.  
  86.     procedure display_keys; external;
  87.  
  88.     procedure save_line(line : CRT_SIZE;
  89.      inc : INC_LIMIT); external;
  90.  
  91.     procedure display_line(line : CRT_SIZE;
  92.      inc : INC_LIMIT); external;
  93.  
  94.     procedure delete_char; external;
  95.  
  96.     procedure ck(a : integer;
  97.      const b : string); external;
  98.  
  99.     procedure write_file; external;
  100.  
  101.     procedure endxqq; external;
  102.  
  103.     procedure down_load; external;
  104.  
  105.     procedure up_load; external;
  106.  
  107.     procedure dump_file; external;
  108.  
  109.     procedure alogin; external;
  110.  
  111.     procedure xmodem_down; external;
  112.  
  113.     procedure xmodem_up; external;
  114.  
  115.     procedure do_ventels; external;
  116.  
  117.     procedure com_end; external;
  118.  
  119.     procedure clear_comm; external;
  120.  
  121.     procedure parse_file(var filename : lstring); external;
  122.  
  123.     procedure chattr(newattr : byte;
  124.      y, sx, ex : integer); external;
  125.  
  126.     procedure login; external;
  127.  
  128.     procedure print_dir; external;
  129.  
  130.     procedure clear_receiver; external;
  131.  
  132.     procedure keyp(inch : char) [public];
  133.  
  134.        var
  135.       i,j,x,y : integer;
  136.       answer : lstring(20);
  137.       num_chars, ca : integer;
  138.       line_buf : lstring(81);
  139.  
  140.        begin               {extended ASCII}
  141.       xrcurp(x,y);           {get cursor position}
  142.       if ( (ord(inch) >= Alt_1) and (ord(inch) <= Alt_0) ) then
  143.         send(function_keys[ord(inch)-Alt_1+1]);
  144.       case ord(inch) of
  145.  
  146.          Alt_EQUAL: begin
  147.         display_keys;
  148.         xxmove(x,y);
  149.         end;
  150.  
  151.          Alt_MINUS:    {change function keys}
  152.           begin
  153.         savescreen;
  154.         xxcls;
  155.         display_keys;
  156.         xxmove(0,0);
  157.         write('Which key do you want to change? ');
  158.         readln(i);
  159.         if ( (i >= 0) and (i < 11) ) then begin
  160.            if i = 0 then i := 10;
  161.            if (function_keys[i,ord(function_keys[i,0])] = chr(13)) then
  162.             function_keys[i,ord(function_keys[i,0])] := chr(174);
  163.            write('That key now = "');
  164.            write(function_keys[i]);
  165.            writeln('"');
  166.            if (function_keys[i,ord(function_keys[i,0])] = chr(174)) then
  167.             function_keys[i,ord(function_keys[i,0])] := chr(13);
  168.            write('New string: ');
  169.            readln(function_keys[i]);
  170.            write('Do you want a newline appended to that? ');
  171.            readln(answer);
  172.            if ( (answer[1] = 'y') or (answer[1] = 'Y') ) then concat(
  173.             function_keys[i],chr(13));
  174.            end;
  175.         restorescreen;
  176.         display_keys;
  177.         end;
  178.  
  179.          END_KEY:      
  180.         if vi_cursor then 
  181.            if emacs_flag then send(chr(27)*'>')
  182.            else send('G')
  183.         else if rogue_mode then send('b')
  184.         else if prime_mode then send(chr(15))
  185.         else eval(breaker)      ;
  186.                    {send BREAK}
  187.  
  188.          HOME:           {top of file if in 'vi'}
  189.         if vi_cursor then 
  190.            if emacs_flag then send(chr(27)*'<')
  191.            else send('1G')
  192.         else if prime_mode then send(chr(23))
  193.         else if rogue_mode then send('y') ;
  194.  
  195.          INSERT_KEY: begin       {ENTER line}
  196.         if (vi_cursor and not prime_mode) then      
  197.            if insert_mode then begin
  198.               send(chr(27));
  199.                    {ESCAPE -- end insert mode}
  200.               if display_buffer_addr = #B800 then xscurt(byword(6,7))
  201.               else xscurt(byword(11,12));
  202.                    {default cursor}
  203.               end
  204.            else begin
  205.               send('i');
  206.                    {go into insert mode}
  207.               xscurt(byword(2,11));
  208.               end   
  209.         else if prime_mode then send(chr(1))
  210.         else if not line_edit then begin
  211.            num_chars := 0;
  212.            for i := LEFT_MAR to RIGHT_MAR do begin
  213.               xxmove(i,y);
  214.               ca := xrca and #FF;
  215.                    {get character}
  216.               if ca < 32 then ca := ord(' ');
  217.               if chr(ca) <> ' ' then num_chars := i;
  218.                    {last non-blank}
  219.               line_buf[i+1] := chr(ca)     end;
  220.            line_buf[0] := chr(num_chars+2);
  221.                    {LSTRING len}
  222.            line_buf[num_chars+2] := NL;
  223.                    {'new line'}
  224.            xxmove(LEFT_MAR,y);
  225.                    {position at start of line}
  226.            send(line_buf)   end
  227.         else insert_mode := not insert_mode;
  228.         end;
  229.  
  230.          DELETE_KEY:       {clear display from cursor}
  231.           begin
  232.         if vi_cursor then send('x')
  233.         else if prime_mode then send(chr(18))
  234.         else if line_edit then delete_char
  235.         else begin
  236.            xwca(NULLB,(RIGHT_MAR+1)-x);
  237.                    {clear rest of line}
  238.            for i:= y+1 to BOTTOM do begin
  239.               xxmove(LEFT_MAR,i);
  240.               xwca(NULLB,(RIGHT_MAR+1))   end;
  241.            xxmove(x,y)       {restore cursor}
  242.            end     end;
  243.  
  244.          C_UP:           {cursor UP}
  245.           begin
  246.         if (vi_cursor or rogue_mode) then 
  247.            if emacs_flag then send(chr(#10))   {^P}
  248.            else send('k')
  249.         else if (prime_mode or adm_sim_flag) then send(chr(#B))
  250.         else begin
  251.            save_line(y,-1);
  252.            if (y>TOP) then xxmove(x,y-1)
  253.            else begin
  254.               xscrldn(1,TOP,BOTTOM);
  255.               display_line(TOP,0)   end   end    end;
  256.  
  257.          C_DOWN:           {cursor DOWN}
  258.           begin
  259.         if (vi_cursor or rogue_mode) then 
  260.             if emacs_flag then send(chr(#E))   {^N}
  261.            else send('j')
  262.         else if (not prime_mode and adm_sim_flag) then send(chr(#A))
  263.         else if (prime_mode and adm_sim_flag) then send(chr(4))
  264.         else begin
  265.            save_line(y,1);
  266.            if (y<BOTTOM) then xxmove(x,y+1)
  267.            else begin
  268.               xscrlup(1,TOP,BOTTOM);
  269.               display_line(BOTTOM,0)   end   end   end;
  270.  
  271.          C_LEFT:           {cursor LEFT}
  272.         if (vi_cursor or rogue_mode) then 
  273.            if emacs_flag then send(chr(2))    {^B}
  274.            else send('h')
  275.         else if (prime_mode or adm_sim_flag) then send(chr(#))
  276.         else if (x>LEFT_MAR) then xxmove(x-1,y)   ;
  277.  
  278.          C_RIGHT:           {cursor RIGHT}
  279.         if (vi_cursor or rogue_mode) then 
  280.            if emacs_flag then send(chr(6))    {^F}
  281.            else send('l')
  282.         else if (prime_mode or adm_sim_flag) then send(chr(#C))
  283.         else if (x<RIGHT_MAR) then xxmove(x+1,y)   ;
  284.  
  285.          PG_UP:           {Page UP}
  286.           begin
  287.         if vi_cursor then 
  288.            if emacs_flag then send(chr(27)*'v')
  289.                else send('11'*chr(21))
  290.         else if prime_mode then send('p'*chr(13))
  291.         else if rogue_mode then send('u')
  292.         else begin
  293.            save_line(y,0);
  294.            xxcls;
  295.            for i := BOTTOM downto TOP+1 do display_line(i,-1);
  296.            display_line(TOP,0);
  297.            xxmove(LEFT_MAR,TOP)   end    end;
  298.  
  299.          PG_DOWN:           {Page DOWN}
  300.           begin
  301.         if vi_cursor then 
  302.            if emacs_flag then send(chr(#16))    {^V}
  303.            else send('11'*chr(4))
  304.         else if rogue_mode then send('n')
  305.         else if prime_mode then send(':'*chr(13))
  306.         else begin
  307.            save_line(y,0);
  308.            xxcls;
  309.            for i := TOP to BOTTOM-1 do display_line(i,1);
  310.            display_line(BOTTOM,0);
  311.            xxmove(LEFT_MAR,BOTTOM)   end   end;
  312.  
  313.          NULL_CHAR:    {^@ - send 'null'}
  314.           send(chr(0));
  315.  
  316.          PrtSc:           {toggle LOG BOTTOM -- output to printer}
  317.           lpt_only_flag := not lpt_only_flag;
  318.  
  319.          F1:           {toggle control character display}
  320.           display_control := not display_control;
  321.  
  322.          F2:           {print the current line}
  323.           begin
  324.         for i := LEFT_MAR to RIGHT_MAR do begin
  325.            xxmove(i,y);
  326.            inch := chr(xrca and #FF);
  327.                    {get character}
  328.            if inch < ' ' then inch := ' ';
  329.                    {make sure it is printable}
  330.            xlpt1(inch)     end;
  331.         xlpt1(chr(13)*chr(10));
  332.                    {CR/LF}
  333.         if y < BOTTOM then xxmove(0,y+1)
  334.         else xxmove(0,y);
  335.         end;
  336.  
  337.          F3:           {send BREAK -- same as End, except that End
  338.                       is used with 'vi'}
  339.            begin            
  340.           send(chr(127));
  341.           clear_receiver;
  342.           end;
  343.  
  344.          F4:    {print directory}
  345.           print_dir;
  346.  
  347.          F5:           {send an "l" (for notes) }
  348.           send('l');
  349.  
  350.          F6:           {send an "j" (for notes) }
  351.           send('j');
  352.  
  353.          F8:           {scroll LOCK}
  354.           begin
  355.         if (scroll_top > 0) then chattr(7, scroll_top, 1, 80);
  356.         xrcurp(x,scroll_top);
  357.                    {set scroll lock here }
  358.         if (scroll_top > 0) then chattr(#70, scroll_top, 1, 80);
  359.         end;
  360.  
  361.          F9:begin           {toggle the display row,column indicator}
  362.         xxmove(38,24);
  363.         xttywrt('     ',7);{blank it out}
  364.         xxmove(x,y);
  365.         display_columns := not display_columns;
  366.         end;
  367.  
  368.          F10:           {toggle the FLOW Control -- XON/XOFF}
  369.           begin
  370.         if xoff_sent then begin
  371.            xoff_sent := false;
  372.            send(XON_CHAR)   end
  373.         else begin
  374.            xoff_sent := true;
  375.            send(XOFF_CHAR)   end   end;
  376.  
  377.          Alt_F1: begin
  378.         writeln(chr(7)*chr(13)*chr(10)* 'Terminating the Simulator');
  379.         write_file;       {update bbs file}
  380.         com_end;
  381.         endxqq     end;
  382.  
  383.          Alt_F2:           {terminate}
  384.                    {terminate and drop the line}
  385.           begin    {Terminate}
  386.         writeln(chr(7)*chr(13)*chr(10)*
  387.              'Terminating the Simulator & Dropping the Line');
  388.         dropline;
  389.         write_file;       {update bbs file}
  390.         com_end;
  391.         endxqq     end;
  392.  
  393.          Alt_F3:           {drop then pick up the line (for ventels) }
  394.           toggle_tr;
  395.  
  396.          Alt_F4:           {toggle the parity_mask}
  397.           parity_mask := parity_mask xor #80;
  398.  
  399.          Alt_F5:           {clear the 25th line}
  400.           begin
  401.         xxmove(0,24);
  402.         xwca(NULLB,RIGHT_MAR+1);
  403.                    {clear rest of line}
  404.         xxmove(x,y)       {restore cursor}
  405.         end;
  406.  
  407.          Alt_F6:           {display some status information}
  408.           begin
  409.         xxmove(0,24);
  410.         if (bbs_numbers) then xttywrt('BBS',112)
  411.         else xttywrt('BBS',7);
  412.         xttywrt('   ',7);
  413.         if ((parity_mask and #80) = #80) then xttywrt('Graphics',112)
  414.         else xttywrt('Graphics',7);
  415.         xttywrt('   ',7);
  416.         if (rogue_mode) then xttywrt('rogue',112)
  417.         else xttywrt('rogue',7);
  418.         xttywrt('   ',7);
  419.         if (vi_cursor) then xttywrt('vi',112)
  420.         else xttywrt('vi',7);
  421.         xttywrt('   ',7);
  422.         if (log_flag) then xttywrt('file log',112)
  423.         else xttywrt('file log',7);
  424.         xttywrt('   ',7);
  425.         if (ignore_dels) then xttywrt('ignore del',112)
  426.         else xttywrt('ignore del',7);
  427.         xttywrt('   ',7);
  428.         if (adm_sim_flag) then xttywrt('ADM3A',112)
  429.         else xttywrt('ADM3A',7);
  430.         xxmove(x,y);
  431.         end;
  432.  
  433.          Alt_F7:           {reset the COMM software}
  434.           clear_comm;
  435.  
  436.          Alt_F10: begin
  437.         writeln(chr(7)*chr(13)*chr(10)* 'Terminating the Simulator');
  438.         write_file;       {update bbs file}
  439.         xxcls;
  440.         com_end;
  441.         endxqq     end;
  442.  
  443.          CNTL_Pg_Dn:       {Download}
  444.           down_load;
  445.  
  446.          CNTL_Pg_Up:       {Upload}
  447.           up_load;
  448.  
  449.          Alt_C:           {toggle the 'LOG FILE' flag}
  450.         if log_flag then begin
  451.            log_flag := false;
  452.            close(log_file);
  453.            xttywrt('Log file is closed.'*chr(10)*chr(13),7);
  454.            end
  455.         else begin
  456.            savescreen;
  457.            xxcls;
  458.            xxmove(0,0);
  459.            write(output,'Log file name: ');
  460.            readln(input,line_buf);
  461.            parse_file(line_buf);
  462.            assign(log_file,line_buf);
  463.            log_file.trap := true;
  464.            rewrite(log_file);
  465.            if log_file.errs <> 0 then begin
  466.               writeln(output,chr(7)*'File not found'*chr(7));
  467.               sleep(3);
  468.               end
  469.            else log_flag := true;
  470.            restorescreen;
  471.            end     ;
  472.  
  473.          Alt_D:           {Dump file to Comm line}
  474.           dump_file;
  475.  
  476.          Alt_E:           {Toggle the vi_cursor mode}
  477.           begin
  478.         writeln(output,'current vi_cursor mode is ',vi_cursor,
  479.              '. New mode is ',not vi_cursor);
  480.         vi_cursor := not vi_cursor;
  481.         end;
  482.  
  483.          Alt_F: line_edit := not line_edit;
  484.  
  485.          Alt_K: alogin;
  486.  
  487.          Alt_L: login;
  488.  
  489.          Alt_P: prime_mode := not prime_mode;
  490.          Alt_R:           {XModem Download/Receive}
  491.           xmodem_down;
  492.  
  493.          Alt_T:           {XModem Upload/Transmit}
  494.           xmodem_up;
  495.  
  496.          Alt_V:           { Call varied functions from ventel.pas}
  497.           do_ventels;
  498.  
  499.          otherwise ;       {anything else -- ignore}
  500.          end;
  501.       end;
  502.  end.
  503.  
  504.  
  505.